package sample.tools;

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 作者：w on 2021-08-21.
 * 邮箱：y141111@126.com
 * 版本：v1.0
 * 1. XML接口
 * http://flash.weather.com.cn/wmaps/xml/china.xml
 * http://flash.weather.com.cn/wmaps/xml/luoyang.xml
 * 这个是全国天气的根节点，列出所有的省，其中的pyName字段是各个省XML的文件名，比如北京的是beijing，那就意味着北京的XML地址为
 * http://flash.weather.com.cn/wmaps/xml/beijing.xml
 * 一个省的天气，其中列出该省各个市的数据，北京就列出各个区。
 * tmp1是最低温低，tmp2是最高温度，url非常重要，我们一会儿再说。state1和state2是神马转神马，每个数代表一个天气现 象。天气现象非常多，我本想全部分析出来，后来直接放弃了这个想法。因为我看到了一个城市的天气现象的编码是26...我现在知道的有0.晴 1.多云 2.阴 6.雨夹雪 7.小雨 8.中雨 13.阵雪 14.小雪
 * 其中后来发现知道这个没用，这个数字的主要作用是检索图片的！！！
 *
 * 2. 图片接口
 * http://m.weather.com.cn/img/c0.gif
 * http://m.weather.com.cn/img/b0.gif
 * http://www.weather.com.cn/m/i/weatherpic/29x20/d0.gif
 * http://www.weather.com.cn/m2/i/icon_weather/29x20/n00.gif
 * 这个图就是天气现象0（晴）的图片，其他天气现象的图片依此类推。c打头的图片是20*20像素的，b打头的是50*46像素的，d打头的是反白的图标，29*20像素，n打头的是夜间反白图标，29*20像素，注意这里的文件名是两位数字！
 *
 *
 * 3. JSON接口
 * http://m.weather.com.cn/atad/101010100.html
 * http://www.weather.com.cn/data/sk/101010100.html
 * http://www.weather.com.cn/data/cityinfo/101010100.html
 */
public class WeatherUtil {
    /**
     * 获取实时天气1<br>
     * 方 法 名： getTodayWeather <br>
     * @param Cityid
     *            城市编码
     */
    public static Map<String, Object> getTodayWeather1(String Cityid)
            throws IOException, NullPointerException {
        // 连接中央气象台的API
        URL url = new URL("http://www.weather.com.cn/data/sk/" + Cityid
                + ".html");
        URLConnection connectionData = url.openConnection();
        connectionData.setConnectTimeout(1000);
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    connectionData.getInputStream(), StandardCharsets.UTF_8));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null)
                sb.append(line);
            String datas = sb.toString();
            System.out.println(datas);
            JSONObject jsonData = JSONObject.parseObject (datas);
            JSONObject info = jsonData.getJSONObject("weatherinfo");
            map.put("city", info.getString("city").toString());// 城市
            map.put("temp", info.getString("temp").toString());// 温度
            map.put("WD", info.getString("WD").toString());// 风向
            map.put("WS", info.getString("WS").toString());// 风速
            map.put("SD", info.getString("SD").toString());// 湿度
            map.put("time", info.getString("time").toString());// 发布时间

        } catch (SocketTimeoutException e) {
            System.out.println("连接超时");
        } catch (FileNotFoundException e) {
            System.out.println("加载文件出错");
        }
        return map;
    }

    /**
     * 获取实时天气2<br>
     * 方 法 名： getTodayWeather <br>
     * @param Cityid
     *            城市编码
     */
    public static Map<String, Object> getTodayWeather2(String Cityid)
            throws IOException, NullPointerException {
        // 连接中央气象台的API
        URL url = new URL("http://www.weather.com.cn/data/cityinfo/" + Cityid
                + ".html");
        URLConnection connectionData = url.openConnection();
        connectionData.setConnectTimeout(1000);
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    connectionData.getInputStream(), "UTF-8"));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null)
                sb.append(line);
            String datas = sb.toString();
            System.out.println(datas);
            JSONObject jsonData = JSONObject.parseObject(datas);
            JSONObject info = jsonData.getJSONObject("weatherinfo");
            map.put("city", info.getString("city").toString());// 城市
            map.put("temp1", info.getString("temp1").toString());// 最高温度
            map.put("temp2", info.getString("temp2").toString());// 最低温度
            map.put("weather", info.getString("weather").toString());//天气
            map.put("ptime", info.getString("ptime").toString());// 发布时间

        } catch (SocketTimeoutException e) {
            System.out.println("连接超时");
        } catch (FileNotFoundException e) {
            System.out.println("加载文件出错");
        }

        return map;

    }
    public static String getLuoYangTianQi(){
        try {
            Map<String, Object> map = getTodayWeather1("101180901");
            Map<String, Object> map2 = getTodayWeather2("101180901");
            return  "\n天气：\t小雨"
//                    + map2.get("weather")
                    + "\n风向：\t" + map.get("WD")
                    + "\n风速：\t" + map.get("WS")
                    + "\n湿度：\t" + map.get("SD")
                    + "\n参考温度：" + map.get("temp")
                    + "℃\n最低温度：" + map2.get("temp1")
                    + "\n最高温度：" + map2.get("temp2")
//                    + "\n更新时间：\t" + map2.get("ptime")
                    ;
        }catch (Exception e){
            return "请检查天气插件！";
        }
    }
    // 测试
    public static void main(String[] args) {
        try {
            //测试获取实时天气1(包含风况，湿度)
            Map<String, Object> map = getTodayWeather1("101180901");
            System.out.println(map.get("city") + "\t" + map.get("temp")
                    + "\t" + map.get("WD") + "\t" + map.get("WS")
                    + "\t" + map.get("SD") + "\t" + map.get("time"));

            //测试获取实时天气2(包含天气，温度范围)
            Map<String, Object> map2 = getTodayWeather2("101180901");
            System.out.println(map2.get("city") + "\t" + map2.get("temp1")
                    + "\t" + map2.get("temp2") + "\t" + map2.get("weather")
                    + "\t" + map2.get("ptime"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
